package com.itheima.advance.reflect.demo04;

import java.lang.reflect.Method;

/**
 * 演示：通过反射去获取某一个类对应的成员方法并使用
 */
public class ReflectDemoo01 {

    public static void main(String[] args) throws Exception {

        // 1. 获取Student类的字节码文件对象
        Class studentClazz = Class.forName("com.itheima.advance.reflect.demo04.Student");

        // 2. 调用Class对象的相关方法去获取指定的成员方法
        /**
         * Method[] getMethods()：												返回所有公共成员方法对象的数组，包括继承的
         * Method[] getDeclaredMethods()：										返回所有成员方法对象的数组，不包括继承的
         * Method getMethod(String name, Class<?>... parameterTypes) ：		返回单个公共成员方法对象
         * Method getDeclaredMethod(String name, Class<?>... parameterTypes)： 返回单个成员方法对象
         */
        // Method[] getMethods()：												返回所有公共成员方法对象的数组，包括继承的
        Method[] methods = studentClazz.getMethods();
        for(Method method : methods) {
            System.out.println(method);
        }

        System.out.println("---------------------------------------------------------");

        // Method[] getDeclaredMethods()：										返回所有成员方法对象的数组，不包括继承的
        Method[] declaredMethods = studentClazz.getDeclaredMethods();
        for(Method method : declaredMethods) {
            System.out.println(method);
        }

        System.out.println("---------------------------------------------------------");

        // Method getMethod(String name, Class<?>... parameterTypes) ：		返回单个公共成员方法对象
        // 第一个参数：表示的就是成员方法的名称
        // 第二个参数：表示的就是这个成员方法上所定义的形式参数类型对应的Class类型
        // public void function1()
        Method function1 = studentClazz.getMethod("function1");
        System.out.println(function1);

        System.out.println("---------------------------------------------------------");

        // public void function2(String name)
        Method function2 = studentClazz.getMethod("function2", String.class);
        System.out.println(function2);

        System.out.println("---------------------------------------------------------");

        // public String function4(String name)
        Method function4 = studentClazz.getMethod("function4", String.class);
        System.out.println(function4);

        //  private void show()
        // Method show = studentClazz.getMethod("show");
        // System.out.println(show);

        // Method getDeclaredMethod(String name, Class<?>... parameterTypes)： 返回单个成员方法对象
        // private void show()
        Method declaredMethod = studentClazz.getDeclaredMethod("show");
        System.out.println(declaredMethod);

        Method declaredMethod1 = studentClazz.getDeclaredMethod("function1");
        System.out.println(declaredMethod1);

    }

}
